import json
from .utils import DateEncoder

"""
错误码定义
"""
# 默认成功
DEFAULT_CODE = 0  # success

# 参数错误
PARAMS_IS_NULL = 10001  # 参数为空
PARAMS_NOT_COMPLETE = 10002  # 参数不全
PARAMS_TYPE_ERROR = 10003  # 参数类型错误
PARAMS_IS_INVALID = 10004  # 参数无效

# 系统错误
SYSTEM_INNER_ERROR = 40001  # 系统内部错误

# 数据错误
DATA_NOT_FOUND = 50001  # 数据未找到
DATA_IS_WRONG = 50002  # 数据有误
DATA_ALREADY_EXISTED = 50003  # 数据已存在
DATA_STATUS_ERROR = 50004  # 数据状态错误

# 外部接口异常
INTERFACE_OUTER_INVOKE_ERROR = 60001  # 第三方接口异常

# 无访问权限
PERMISSON_NO_ACCESS = 70001  # 没有访问权限

# 数据库错误
DATA_BASE_ERROR = 80001  # 数据库命令执行失败

# 错误码对应错误信息
MESSAGE = {
    DEFAULT_CODE: "success",
    # 参数错误
    PARAMS_IS_NULL: "参数为空",
    PARAMS_NOT_COMPLETE: "参数不全",
    PARAMS_TYPE_ERROR: "参数类型错误",
    PARAMS_IS_INVALID: "参数无效",

    # 系统错误
    SYSTEM_INNER_ERROR: "系统内部错误",

    # 数据错误
    DATA_NOT_FOUND: "数据未找到",
    DATA_IS_WRONG: "数据有误",
    DATA_ALREADY_EXISTED: "数据已存在",
    DATA_STATUS_ERROR: "数据状态错误",

    # 外部接口异常
    INTERFACE_OUTER_INVOKE_ERROR: "第三方接口异常",
    # 无访问权限
    PERMISSON_NO_ACCESS: "没有访问权限",
    # 数据库错误
    DATA_BASE_ERROR: "数据库命令执行失败"
}


# 自定义接口返回信息
class CustomErrNo:
    def __init__(self, status_code=None, payload=None, msg=None):
        if not status_code:
            self.status_code = DEFAULT_CODE
        else:
            self.status_code = status_code
        self.payload = payload
        self.msg = msg

    def to_json(self, original=None):
        return json.dumps(self.to_dict(original=original), cls=DateEncoder)

    def to_dict(self, original=None):
        if original:
            if isinstance(original, str):
                original = json.loads(original)
            return original

        ctx = dict()
        ctx["data"] = dict(self.payload or ())
        ctx["errno"] = self.status_code
        if self.msg is None:
            errmsg = MESSAGE.get(self.status_code)
        else:
            errmsg = self.msg
        ctx["errmsg"] = errmsg
        return ctx
